package com.atguigu.gulimall.order.threadtest;
import java.util.concurrent.*;
public class threadtest{

    public static void main(String[] args) throws ExecutionException, InterruptedException {

        ThreadPoolExecutor executor = new ThreadPoolExecutor(
                10,
                50,
                100,
                TimeUnit.SECONDS,
                new LinkedBlockingDeque<>(),
                Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.AbortPolicy());

        int a=1;

        CompletableFuture<Integer> future1 = CompletableFuture.supplyAsync(() -> {
            System.out.println(Thread.currentThread().getId());
            System.out.println(1);
            return 1;
        },executor);


        CompletableFuture<Integer> future2 = CompletableFuture.supplyAsync(() -> {
            System.out.println(Thread.currentThread().getId());
            try {
                TimeUnit.SECONDS.sleep(3);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            System.out.println(2);
            return 2;
        },executor);

        //对两个线程的处理结果
        //1、两者有一个完成先完成就进行
        // runAfterEither
        // acceptEither
        // applyToEither


        future1.runAfterEither(future2,()->{
            System.out.println("有一个已经先完成了,但我不接受他的返回值也没有返回值");
        });

        future1.acceptEither(future2,(f)->{
            System.out.println("有一个已经先完成了,接受到了他的返回值"+f);
        });

        CompletableFuture<String> either = future1.applyToEither(future2, (f) -> {
            System.out.println("有一个已经先完成了,接受到了他的返回值" + f);
            return "我自己的返回值"+f;
        });

        String s = either.get();
        System.out.println(s);


        //2、两者都完成之后进行
        // runAfterBoth  不接受前面两个的返回值，没有返回值
        // thenAcceptBoth 接收前面两个的返回值，没有返回值
        // thenCombine   接收前面两个的返回值，再有返回值

//        future1.runAfterBoth(future2,()->{
//            System.out.println("两个都完成了，该我了");
//        });
//
//        future1.thenAcceptBoth(future2,(e,f)->{
//            System.out.println("两个都完成了，该我了,接收到了返回值"+e+f);
//        });
//
//        CompletableFuture<String> combine = future1.thenCombine(future2, (e, f) -> {
//            System.out.println("两个都完成了，该我了,接收到了返回值" + e + f);
//            return "我的返回值是" + "new" + e + f;
//        });

//        String s = combine.get();
//        System.out.println(s);



    }
}
